/*
  require är en node-funktion som läser in ett node-bibliotek, se nedan hur man kan använda den.
  Det går att skriva egen kod i andra filer som man sen importerar med require. 
  (Vilket vi gör, 'utils' och 'twoPersonChat' är lokala)
  http://stackoverflow.com/questions/5311334/what-is-the-purpose-of-nodejs-module-exports-and-how-do-you-use-it/5311377#5311377
  
  Ex: require('http') läser in http-biblioteket och spottar ur sig en klass med en massa metoder
  man kan anvanda, t. ex. http.createServer(dinRequestListener) där 'dinRequestListener' ska ta två argument,
  dinRequestListener(request, response), se nedan for kod.
  http://nodejs.org/api/http.html
*/
var express = require('express')
, app = express()
, UserModel = require('./User').UserModel
, db = require('./User').db
, RedisStore = require('connect-redis') (express)
, secret_salt_hash = 'secret salt hash'
, fs = require('fs')
, url = require('url')
, sIOLayer = require('./socketIO-layer.js');




app.post('/', function(req, res) {
    console.log('trying to log in, name = ' + req.body.name + ', pwd = ' + req.body.password);
    //db.once('open', function callback () {
    UserModel.findOne({name: req.body.name}, function(err, result) {
        console.log("matches: " + result);
        if (result === null) {
            console.log('nope...');
            res.send('No such user!');
        }
        else if (result.password === req.body.password) {
            console.log('Yea!!!');
            req.session.user = result;
            res.send('Logged in!!!');
        }
    });
    //});
});


/*
  Funktionen som http.createServer vill ha.
  tar request och response,
  For varje request, läser den in 'index.html' och 
  spottar ur sig den.

  Siffrorna 500 och 200 är http-status-koder,
  mer info på
  http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
  500 är 'Internal Server Error',
  200 är 'OK'

  Servern kommunicerar via HTTP,
  http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
  ett http-meddelande består av HEADER och DATA,
  headern innehåller STATUS (siffran över),
  och lite andra saker - webbläsare skickar namnet och 
  verisionen på sig själv, servern skickar t. ex. kakor.
  Man kan kolla vad som finns i headern t. ex. mha TELNET,
  i linux:
  > telnet ADRESS SOCKET
  Trying ADRESS...
  Connected to ADRESS.
  Escape character is ^]
  > GET / HTTP/1.1
  
  
  HTTP/1.1 200 OK
  Set-Cookie: testKaka=testTesttestTest; Max-Age=100; Domain=213.103.197.232; Path=/;
  Content-Type: text/plain
  Connection: keep-alive
  Transfer-Encoding: chunked

  I headern kan man stoppa in kakor, vilket är det vi gör.
  Kakorna sparas lokalt på webbläsaren och skickas med till
  servern nästa gång du ansluter.
  I en kaka får du max ha 255 tecken.
  Mer om den tekniska delen på kakor finns på wikipedia:
  http://en.wikipedia.org/wiki/HTTP_cookie#Implementation


  Vi parsar URL:en via 'url', 
  SE DOKUMENTATIONEN, 
  http://nodejs.org/docs/latest/api/url.html
  Om man skriver in ADRESS:PORT/main.js i webbläsaren,
  ska man få den här filen tillbaka.
  Samma ska gå för allt annat i mappen.
*/

// Can we specify app.get('anything', blablabla) ???
app.get('/', function handler (req, res) {

    /* SKÖTS AV EXPRESS 
    // Vill testa om den skickar kakor eller inte...
    var has_cookie = (req.headers.cookie !== undefined);
    

    // var request_IP = req.connection.remoteAddress
    
    var parsedUrl = url.parse(req.url);

    console.log("handler: request for url = " + req.url + ", parsed = " + parsedUrl.pathname);
    if (parsedUrl.pathname === '/') {

    if (has_cookie) {
    console.log("Has a cookie! Here it is: ");
    console.log(req.headers.cookie);
    }

    else {
    
    console.log("No cookie...");
    var user_id = makeid(10);
    // Testar skicka kaka
    res.writeHead(200, {
    'Set-Cookie' : 'userid=' + user_id,
    'Content-Type': 'text/plain'
    });
    }
    */
    fs.readFile(__dirname + '/index.html',
                function (err, data) {
                    if (err) {
                        res.writeHead(500);
                        return res.end('Error loading ' + 'index.html');
                    }
                    if (has_cookie) res.writeHead(200);
                    res.end(data);
                });
});


/*
else {
    
    fs.readFile(__dirname + parsedUrl.pathname,
                function (err, data) {
                    if (err) {
                        res.writeHead(500);
                        return res.end('Error loading ' + parsedUrl.pathname);
                    }
                    if (has_cookie) res.writeHead(200);
                    res.end(data);
                });
}
});
*/

app.listen(12345);

sIOLayer.serverToSocket(server);
